﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _02.@class
{
    //继承、实现；base、this；
    //如果想多态，父子类的方法上需要分别添加关键字：virtual/override！
    //如果只是覆盖（隐藏），子类方法new或者空白即可！使用父类对象，调用的就是父类方法；使用子类对象，调用的就是子类方法！
    class Program
    {
        static void Main(string[] args)
        {
            Enemy enemy = new Enemy();
            enemy.Attack();
            enemy.AI();
            enemy.Move();
            Console.WriteLine("-------");

            Enemy p = new Boss();
            p.Attack();
            p.AI();
            p.Move();
            Console.WriteLine("-------");

            Boss boss = new Boss();
            boss.Attack();
            boss.AI();
            boss.Move();
            boss.Call();
            Console.WriteLine("-------");



            Console.ReadKey();
        }
    }

    class Enemy : IAttack
    {
        public int HP { get; set; }

        public void AI()
        {
            Console.WriteLine("Enemy AI!");
            Attack();
        }

        public virtual void Attack()
        {
            Console.WriteLine("Enemy Attack!");
        }

        public void Move()
        {
            Console.WriteLine("Enemy Move!");
        }
    }

    interface IAttack
    {
        void Attack();
    }
    class Boss : Enemy
    {
        //virtual/override 多态调用
        public override void Attack()
        {
            Console.WriteLine("Boss Attack!");
        }

        //new 覆盖/隐藏 父类的方法 - 结果就是，方法跟随引用类型
        public new void Move()
        {
            Console.WriteLine("Boss Move!");
        }

        public void Call()
        {
            base.Attack(); //base，父类内容
        }
    }
}
